import {isEmpty, isString, assert} from "../public";

export default class Condition {
  field;
  expr;
  value;
  ignoreValue = [];
  // static EXPRS = ['eq', 'in', 'and', 'or', 'like', 'pattern'];
  static EXPRS = {
    eq: "",
    and: "%", //Bettween…And连续查询   "column%": "columnValue1,columnValue2"
    or: "{}", //匹配条件范围查询-OR：  "column{}": "<=columnValue1,>columnValue2"
    radius: "&{}", //匹配条件范围查询-AND："column&{}": "<=columnValue1,>columnValue2"
    option: "{}", //匹配选项查询：  "column{}": ["columnValue1", "columnValue2"]
    contain: "<>", //包含选项查询：  "column<>": "columnValue"
    exist: "}{@", //判断是否存在：
    like: "$", //模糊查询   "column$": "%value%"
    pattern: "~", //正则表达式查询 "column~": "regular"
    //逻辑运算查询 与
    lo: "&{}",
    //逻辑运算查询 或
    lo1: "|{}",
    //逻辑运算查询 非
    lo2: "!{}",
    //比较运算查询 > >= < <=
    co: ">",
    co1: "<",
    co2: "<=",
    co3: ">=",
  };

  constructor(field, expr, value) {
    assert(!isEmpty(field) && isString(field), `[ApiJson] ${field} 非法`);
    //把EXPRS中的值转换成数组
    let exprs = Object.keys(Condition.EXPRS);
    assert(
      exprs.indexOf(expr) > -1,
      `[ApiJson] 未知操作符 ${expr}, 支持的操作符为: ${exprs}`
    );

    this.field = field;
    this.expr = expr;
    this.value = value;
  }

  static by(field, expr, value) {
    return new Condition(field, expr, value);
  }

  ignore(ignoreValue) {
    if (Array.isArray(ignoreValue)) {
      this.ignoreValue = ignoreValue;
    } else {
      this.ignoreValue.push(ignoreValue);
    }
    return this;
  }

  toJson() {
    const json = {};
    const { field, expr, value, ignoreValue } = this;
    if (ignoreValue.indexOf(value) > -1) {
      return null;
    }
    //循环遍历EXPRS中的值
    json[field + Condition.EXPRS[expr]] = value;
    if (expr == "like"){
        json[field + "$"] = "%" + value + "%";
    }
      // switch (expr) {
      //   case "eq":
      //     json[field] = value; // 5
      //     break;
      //   case "in":
      //     json[field + "{}"] = value; // [1,2,3]
      //     break;
      //   case "and":
      //     json[field + "%"] = value; // ">=300, <=400"
      //     break;
      //   case "like":
      //     json[field + "$"] = "%" + value + "%"; // "meta"
      //     break;
      //   case "pattern":
      //     json[field + "?"] = value; // "^[0-9]+$"
      //     break;
      //   default:
      //     throw new Error(`[ApiJson] 未知操作类型： ${expr}`);
      // }
      return json;
  }
}